
// 1.进程程序替换
//  #include <stdio.h>
//  #include <unistd.h>
//  #include <sys/wait.h>

// int main() {
//     pid_t pid = fork();

//     if (pid < 0) {
//         perror("fork failed");
//         return 1;
//     }
//     else if (pid == 0) {  // 子进程
//         printf("\n===== 子进程开始 =====\n");
//         printf("Child process (PID: %d) will execute ls\n", getpid());
//         sleep(1);  // 增加延迟，让输出顺序更清晰

//         // 执行 ls 命令
//         if (execlp("ls", "ls", "-l", NULL) == -1) {
//             perror("execlp failed");
//             return 1;
//         }

//         printf("This line will not be printed if execlp succeeds\n");
//     }
//     else {  // 父进程
//         printf("Parent process (PID: %d) waiting for child (PID: %d)\n", getpid(), pid);
//         wait(NULL);  // 等待子进程结束
//         printf("\n===== 子进程结束 =====\n");
//         printf("Child process completed\n");
//     }

//     return 0;
// }
// 2.xshell实现
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <ctype.h>   
#include <sys/wait.h> 
#define MAX_CMD 1024
char command[MAX_CMD];
int do_face()
{
    memset(command, 0x00, MAX_CMD);
    printf("minishell$ ");
    fflush(stdout);
    if (scanf("%[^\n]%*c", command) == 0)
    {
        getchar();
        return -1;
    }
    return 0;
}
char **do_parse(char *buff)
{
    int argc = 0;
    static char *argv[32];
    char *ptr = buff;
    while (*ptr != '\0')
    {
        if (!isspace(*ptr))
        {
            argv[argc++] = ptr;
            while ((!isspace(*ptr)) && (*ptr) != '\0')
            {
                ptr++;
            }
        }
        else
        {
            while (isspace(*ptr))
            {
                *ptr = '\0';
                ptr++;
            }
        }
    }
    argv[argc] = NULL;
    return argv;
}
int do_exec(char *buff)
{
    char **argv = {NULL};
    int pid = fork();
    if (pid == 0)
    {
        argv = do_parse(buff);
        if (argv[0] == NULL)
        {
            exit(-1);
        }
        execvp(argv[0], argv);
    }
    else
    {
        waitpid(pid, NULL, 0);
    }
    return 0;
}
int main(int argc, char *argv[])
{
    while (1)
    {
        if (do_face() < 0)
            continue;
        do_exec(command);
    }
    return 0;
}